﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Business.Entities;
using Business.Logic;
using System.Text.RegularExpressions;

namespace UI.Desktop
{
    public partial class PersonasDesktop : ApplicationForm
    {
        private List<Plan> _ListaPlanes;

        public List<Plan> ListaPlanes
        {
            get { return _ListaPlanes; }
            set { _ListaPlanes = value; }
        }

        private Persona _PersonaActual = new Persona();

        public Persona PersonaActual
        {
            get { return _PersonaActual; }
            set { _PersonaActual = value; }
        }

        #region Constructores 

        public PersonasDesktop()
        {
            InitializeComponent();
        }

        //dar alta a una Materia
        public PersonasDesktop(ModoForm modo, List<Plan> Lista)
            : this()
        {            
            this.Modo = modo;
            ListaPlanes = Lista;
            //solo busca el nombre del boton
            MapearDeDatos();
        }

        //modificar o eliminar usuario
        public PersonasDesktop(int ID, ModoForm modo, List<Plan> Lista): this()
        {
            try
            {
                ListaPlanes = Lista;
                this.Modo = modo;
                PersonaLogic perLog = new PersonaLogic();
                PersonaActual = perLog.GetOne(ID);
                MapearDeDatos();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                this.Close();
            }
        }

        #endregion


        #region Métodos

        protected override void MapearDeDatos()
        {
            if (ModoForm.Alta != this.Modo)
            {
                this.txtID.Text = Convert.ToString(PersonaActual.ID);
                txtNombre.Text = PersonaActual.Nombre;
                txtApellido.Text = PersonaActual.Apellido;
                txtDireccion.Text = PersonaActual.Direccion;
                txtEmail.Text = PersonaActual.Email;
                txtTelefono.Text = PersonaActual.Telefono;
                txtLegajo.Text = PersonaActual.Legajo.ToString();
                mtxtFechaNac.Text =Convert.ToString(PersonaActual.FechaNacimiento);
                cmbTipoPersona.Text =Convert.ToString(PersonaActual.TipoPersona);
                cmbIDPlan.Text = BuscarPlan();
            }
            switch (this.Modo)
            {
                case ModoForm.Alta: 
                    btnAceptar.Text = "Guardar";
                    break;
                case ModoForm.Baja: btnAceptar.Text = "Eliminar";
                    txtLegajo.ReadOnly = true;
                    txtNombre.ReadOnly = true;
                    txtApellido.ReadOnly = true;
                    txtDireccion.ReadOnly = true;
                    txtEmail.ReadOnly = true;
                    txtTelefono.ReadOnly = true;
                    cmbTipoPersona.Enabled = false;
                    mtxtFechaNac.ReadOnly = true;
                    cmbIDPlan.Enabled = false;
                    break;
                case ModoForm.Modifica: btnAceptar.Text = "Guardar";
                    break;
                case ModoForm.Consulta: btnAceptar.Text = "Aceptar";
                    txtLegajo.ReadOnly = true;
                    txtNombre.ReadOnly = true;
                    txtApellido.ReadOnly = true;
                    txtDireccion.ReadOnly = true;
                    txtEmail.ReadOnly = true;
                    mtxtFechaNac.ReadOnly = true;
                    txtTelefono.ReadOnly = true;
                    cmbTipoPersona.Enabled = false;
                    cmbIDPlan.Enabled = false;
                    break;
            }
        }

        private string BuscarPlan()
        {
            string DescPlan="";
            foreach (Plan p in ListaPlanes)
            {
                if (PersonaActual.IDPlan == p.ID)
                {
                    DescPlan = p.Descripcion;
                }
            }
            return DescPlan;
        }

        private int BuscarIdPlan()
        {
            int idPlan = 0;
            foreach (Plan p in ListaPlanes)
            {
                if (cmbIDPlan.Text.Trim() == p.Descripcion)
                {
                    idPlan = p.ID;
                }
            }
            return idPlan;
        }

        protected override void MapearADatos()
        {
            try
            {
                switch (Modo)
                {
                    case ModoForm.Alta:
                        Persona per = new Persona();
                        per.Nombre = txtNombre.Text;
                        per.Apellido = txtApellido.Text;
                        per.Direccion = txtDireccion.Text;
                        per.Email = txtEmail.Text;
                        per.FechaNacimiento = DateTime.Parse(mtxtFechaNac.Text);
                        per.IDPlan = BuscarIdPlan();
                        switch (cmbTipoPersona.Text)
                        {
                            case "Alumno":
                                per.TipoPersona = Persona.TiposPersonas.Alumno;
                                break;
                            case "Profesor":
                                per.TipoPersona = Persona.TiposPersonas.Profesor;
                                break;
                            case "Administrador":
                                per.TipoPersona = Persona.TiposPersonas.Administrador;
                                break;
                        }
                        per.Telefono = txtTelefono.Text;
                        per.Legajo = int.Parse(txtLegajo.Text);
                        per.State = Persona.States.New;
                        PersonaActual = per;
                        break;

                    case ModoForm.Consulta:
                        PersonaActual.ID = int.Parse(txtID.Text);
                        PersonaActual.Nombre = txtNombre.Text;
                        PersonaActual.Apellido = txtApellido.Text;
                        PersonaActual.Direccion = txtDireccion.Text;
                        PersonaActual.Email = txtEmail.Text;
                        PersonaActual.FechaNacimiento = DateTime.Parse(mtxtFechaNac.Text);
                        PersonaActual.IDPlan = BuscarIdPlan();
                        PersonaActual.Legajo = int.Parse(txtLegajo.Text);
                        PersonaActual.TipoPersona = ((Persona.TiposPersonas)cmbTipoPersona.SelectedItem);
                        PersonaActual.Telefono = txtTelefono.Text;
                        PersonaActual.State = Persona.States.Unmodified;
                        break;

                    case ModoForm.Modifica:
                        PersonaActual.ID = int.Parse(txtID.Text);
                        PersonaActual.Nombre = txtNombre.Text;
                        PersonaActual.Apellido = txtApellido.Text;
                        PersonaActual.Direccion = txtDireccion.Text;
                        PersonaActual.Email = txtEmail.Text;
                        PersonaActual.FechaNacimiento = Convert.ToDateTime(mtxtFechaNac.Text);
                        PersonaActual.IDPlan = BuscarIdPlan();
                        PersonaActual.Legajo = int.Parse(txtLegajo.Text);
                        switch (cmbTipoPersona.Text)
                        {
                            case "Alumno":
                                PersonaActual.TipoPersona = Persona.TiposPersonas.Alumno;
                                break;
                            case "Profesor":
                                PersonaActual.TipoPersona = Persona.TiposPersonas.Profesor;
                                break;
                            case "Administrador":
                                PersonaActual.TipoPersona = Persona.TiposPersonas.Administrador;
                                break;
                        }
                        PersonaActual.Telefono = txtTelefono.Text;
                        PersonaActual.State = Persona.States.Modified;
                        break;

                    case ModoForm.Baja:
                        PersonaActual.ID = int.Parse(txtID.Text.Trim());
                        PersonaActual.State = Persona.States.Deleted;
                        break;
                }
            }
            catch (FormatException fe)
            {
                throw fe;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        protected override void GuardarCambios()
        {
            try
            {
                PersonaLogic al = new PersonaLogic();
                if (this.Modo != ModoForm.Baja)
                    al.Save(PersonaActual);
                else
                    al.Delete(PersonaActual);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        protected override bool Validar()
        {
            ValidacionesEspeciales val = new ValidacionesEspeciales();
            string mensaje = "";
            if (txtNombre.Text == "")
                mensaje += "- Debe completar el campo Nombre" + "\n";
            if(val.TipoValidacion(ValidacionesEspeciales.Tipos.esNumero,txtNombre.Text.Trim()))
                mensaje += "- El campo Nombre contiene números" + "\n";
            if (val.TipoValidacion(ValidacionesEspeciales.Tipos.esSimbolo, txtNombre.Text.Trim()))
                mensaje += "- El campo Nombre contiene símbolos" + "\n";
            if (!val.TipoValidacion(ValidacionesEspeciales.Tipos.esMenor50, txtNombre.Text.Trim()))
                mensaje += "- El campo Nombre tiene más de 50 caracteres" + "\n";
            if (txtApellido.Text == "")
                mensaje += "- Debe completar el campo Apellido" + "\n";
            if (val.TipoValidacion(ValidacionesEspeciales.Tipos.esNumero, txtApellido.Text.Trim()))
                mensaje += "- El campo Apellido contiene números" + "\n";
            if (val.TipoValidacion(ValidacionesEspeciales.Tipos.esSimbolo, txtApellido.Text.Trim()))
                mensaje += "- El campo Apellido contiene símbolos" + "\n";
            if (!val.TipoValidacion(ValidacionesEspeciales.Tipos.esMenor50, txtApellido.Text.Trim()))
                mensaje += "- El campo Nombre tiene más de 50 caracteres" + "\n";
            if (txtDireccion.Text == "")
                mensaje += "- Debe completar el campo Direccion" + "\n";
            if (val.TipoValidacion(ValidacionesEspeciales.Tipos.esSimbolo, txtDireccion.Text.Trim()))
                mensaje += "- El campo Direccion debe contener solo números" + "\n";
            if (!val.TipoValidacion(ValidacionesEspeciales.Tipos.esMenor50, txtDireccion.Text.Trim()))
                mensaje += "- El campo Nombre tiene más de 50 caracteres" + "\n";
            if (txtEmail.Text == "")
                mensaje += "- Debe completar el campo Email" + "\n";
            if (!val.TipoValidacion(ValidacionesEspeciales.Tipos.esMenor50, txtEmail.Text.Trim()))
                mensaje += "- El campo Nombre tiene más de 50 caracteres" + "\n";
            if (txtTelefono.Text == "")
                mensaje += "- Debe completar el campo Telefono" + "\n";
            if (val.TipoValidacion(ValidacionesEspeciales.Tipos.esLetra, txtTelefono.Text.Trim()))
                mensaje += "- El campo Telefono debe contener solo números" + "\n";
            if (val.TipoValidacion(ValidacionesEspeciales.Tipos.esSimbolo, txtTelefono.Text.Trim()))
                mensaje += "- El campo Telefono debe contener solo números" + "\n";
            if (!val.TipoValidacion(ValidacionesEspeciales.Tipos.esMenor50, txtTelefono.Text.Trim()))
                mensaje += "- El campo Nombre tiene más de 50 caracteres" + "\n";
            if (txtLegajo.Text == "")
                mensaje += "- Debe completar el campo Legajo" + "\n";
            if (mtxtFechaNac.Text==null)
                mensaje += "- Debe completar el campo Fecha de nacimiento" + "\n";
            if (cmbTipoPersona.Text == null)
                mensaje += "- Debe seleccionar un tipo de persona\n";

            if (!val.TipoValidacion(ValidacionesEspeciales.Tipos.esNumero, txtLegajo.Text))
                mensaje += "- El campo Legajo debe ser un entero\n";

            if (!validarEmail(txtEmail.Text))
                mensaje += "- El email es incorrecto\n";

            if (cmbTipoPersona.Text == "")
                mensaje += "- Debe elegir un tipo de persona";

            if (mensaje == "")
                return true;
            else
            {
                MessageBox.Show(mensaje, "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return false;
            }
        }

        private static bool validarEmail(string email)
        {
            return Regex.IsMatch(email,
                  @"^(?("")("".+?""@)|(([0-9a-zA-Z]((\.(?!\.))|[-!#\$%&'\*\+/=\?\^`\{\}\|~\w])*)(?<=[0-9a-zA-Z])@))" +
                  @"(?(\[)(\[(\d{1,3}\.){3}\d{1,3}\])|(([0-9a-zA-Z][-\w]*[0-9a-zA-Z]\.)+[a-zA-Z]{2,6}))$");
        }

        #endregion


        #region Eventos

        private void PersonasDesktop_Load(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'tp2_netDataSet5.planes' Puede moverla o quitarla según sea necesario.
            this.planesTableAdapter.Fill(this.tp2_netDataSet5.planes);
            // TODO: esta línea de código carga datos en la tabla 'tp2_netDataSet4.personas' Puede moverla o quitarla según sea necesario.
            this.personasTableAdapter2.Fill(this.tp2_netDataSet4.personas);
            // TODO: esta línea de código carga datos en la tabla 'tp2_netDataSet3.personas' Puede moverla o quitarla según sea necesario.
            this.personasTableAdapter1.Fill(this.tp2_netDataSet3.personas);
            // TODO: esta línea de código carga datos en la tabla 'tp2_netDataSet2.personas' Puede moverla o quitarla según sea necesario.
            this.personasTableAdapter.Fill(this.tp2_netDataSet2.personas);

            foreach (Plan p in ListaPlanes)
            {
                cmbIDPlan.Items.Add(p.Descripcion);
            }
        }

        private void btnAceptar_Click(object sender, EventArgs e)
        {
            try
            {
                if (this.Modo != ModoForm.Consulta)
                {
                    if (Validar() != false)
                    {
                        MapearADatos();
                        GuardarCambios();
                        switch (Modo)
                        {
                            case ModoForm.Alta:
                                MessageBox.Show("La persona fue registrada correctamente", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                                break;
                            case ModoForm.Modifica:
                                MessageBox.Show("La persona fue modificada correctamente", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                                this.Close();
                                break;
                            case ModoForm.Baja:
                                MessageBox.Show("La persona fue eliminada correctamente", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                                this.Close();
                                break;
                        }
                        btnCancelar.Text = "Cerrar";
                    }
                }
                else
                {
                    MapearDeDatos();
                    this.Close();
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Advertencia", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        #endregion
   
    }
}
